package 第二周;

import java.util.HashSet;
import java.util.Set;

public class 模拟行走机器人 {
    public int robotSim(int[] commands, int[][] obstacles) {
        Set<Long> obsSet = new HashSet<>();
        int ans = 0; // 记录答案
        int dir = 0; // 默认为北方向 其中 东(->):1 南(↓):2 西(←): 3
        int initX = 0, initY = 0;
        // 行走数组
        int[] dx = new int[]{0, 1, 0, -1};
        int[] dy = new int[]{1, 0, -1, 0};
        for (int[] obstacle : obstacles) {
            long obsHash = calHash(obstacle[0], obstacle[1]);
            obsSet.add(obsHash); // 将坐标的hash值存set中，以便后续进行判断
        }

        // 进行行走
        for (int command : commands) {
            if (command == -1) {
                // 向左转90
                dir = (dir + 1) % 4;
            } else if (command == -2) {
                // 向右转90
                dir = (dir - 1 + 4) % 4;
            } else {
                // 开始行走
                for (int i = 0; i < command; i++) {
                    if (obsSet.contains(calHash(initX+dx[dir],initY+dy[dir]))){
                        // 判断下一步是否是障碍物，要是是障碍则不进行行走
                        break;
                    }
                    initX += dx[dir];
                    initY += dy[dir];
                    ans = Integer.max(ans,(initX*initX+initY*initY));
                }
            }
        }
        return ans;
    }

    // 计算障碍物坐标的hash值，自定义hash
    public long calHash(int x, int y) {
        return x * 600000001L + y;
    }

    /*
     *
     *
     * */
    public static void main(String[] args) {
        int[] commands = new int[]{4,-1,4,-2,4};
        int[][] obstacles = new int[][]{{2,4}};
        System.out.println(new 模拟行走机器人().robotSim(commands,obstacles));
    }
}
